package com.lpf.nio;

import java.nio.ByteBuffer;

/**
 * 功能描述：slice buffer的使用。
 *          slice buffer 与原有的 buffer 共享相同的底层数组，
 *          slice方法是创建一个和当前buffer共享内容块的新buffer，
 *          sliceBuffer更改内容buffer里也能看到，因此，新的buffer其实是索引.
 *          另外，两个buffer的position、limit、mark是相互独立的。
 *
 * @author lpf
 * @date 2019/11/25 18:51
 * @version: 1.0
 **/
public class NioTest06 {

    public static void main(String[] arg) {
        ByteBuffer buffer = ByteBuffer.allocate(10);

        for (int i = 0; i < buffer.capacity(); i++) {
            buffer.put((byte) i);
        }

        // slice 时的起止位置
        buffer.position(3);
        buffer.limit(8);

        /*
         * 创建一个和当前buffer共享内容块的buffer
         */
        // 返回快照（返回部分数据的引用），底层还是同一份数据
        ByteBuffer sliceBu = buffer.slice();

        // 取出sliceBu的每一个数据乘以2在放进去
        for (int i = 0; i < sliceBu.capacity(); i++) {
            byte b = sliceBu.get(i);
            b *= 2;
            sliceBu.put(i, b);
        }

        //ByteBuffer readonly = buffer.asReadOnlyBuffer(); // 只读 buffer，只能读不能写

        buffer.position(0);
        buffer.limit(buffer.capacity());
        while (buffer.hasRemaining()) {
            System.out.println(buffer.get());
        }

    }
}
